home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 6
/
FM Towns Free Software Collection 6.iso
/
t_os
/
et
/
src
/
pna.c
< prev
next >
Wrap
Text File
|
1993-07-08
|
16KB
|
541 lines
#include "et.h"
void copy_pna(int menu_i)/*et*/
{
static DIR Dir[1];
static int dv_n, dv_i, pna_i, pna_n;
char file_a[100], s_a[100];
char *c_p, *s_p;
int i, key, dv_b;
static TT Tt;
G_pn.wink = P_i[i_WIN_PNA];
set_bit(G_f, f_TT);
disp_menu(menu_i, P_v[v_VIEW_0], 1, 0);
copy_buffer(2, STORE, NULL, 0);
if (!test_bit(G_f2, f2_PNA)) {
set_bit(G_f2, f2_PNA);
Tt.p = G_mn[mn_DISK].p+72;
Tt.q = G_mn[mn_DISK].q;
dv_n = dv_i = G_nb.pna_drive;
while (!_get_current_directory(s_a, dv_n))
dv_n++;
dv_n--;
} else {
_select_disk(2);
_select_disk(dv_i);
}
strcpy(Tt.s, P_c[c_PNA_BAR]);
Tt.col = H_RED;
disp_drive(dv_i, -1, Tt);
dv_b = dv_i;
pna_i = P_i[i_PNA_I][dv_i];
pna_n = P_i[i_PNA_N][dv_i];
if (pna_n > 0)
find_pna(dv_i, pna_i, Dir);
key = 0;
do {
if (dv_i != dv_b) {
P_i[i_PNA_I][dv_b] = pna_i;
P_i[i_PNA_N][dv_b] = pna_n;
disp_drive(dv_b, dv_i, Tt);
dv_b = dv_i;
pna_i = P_i[i_PNA_I][dv_i];
pna_n = P_i[i_PNA_N][dv_i];
if (pna_n > 0)
find_pna(dv_i, pna_i, Dir);
}
if (P_i[i_PNA_N][dv_i] < 0) {
move_pna(dv_i);
_select_disk(2);
_select_disk(dv_i);
pna_n = make_pna_list(dv_i);
goto_current();
pna_i = 0;
P_i[i_PNA_I][dv_i] = pna_i;
P_i[i_PNA_N][dv_i] = pna_n;
if (pna_n > 0)
find_pna(dv_i, pna_i, Dir);
}
if (!pna_n)
s_p = P_c[c_PNA_BAR];
else {
strcpyfar(file_a, Dir->s);
strcpy(s_a, file_a);
s_p = shift_pna(s_a);
s_p[instring('.', s_p, sizeof(char))-1] = '\0';
}
draw_ank(H_RED, 11-strlen(Tt.s), Tt.p, Tt.q, Tt.s, 0);
for (i = 2; i; i--, exchange_page()) {
if (i == 1) {
copy_window(P_i[i_WIN_PNA], P_v[v_KEY_TMP], 0x14, POKE);
continue;
}
draw_ank(H_RED, 11-strlen(Tt.s), Tt.p, Tt.q, Tt.s, 0);
draw_ank(L_WHT, 11-strlen(Tt.s), Tt.p, Tt.q, Tt.s, 0);
draw_ank(L_WHT, 11-strlen(s_p), Tt.p, Tt.q, s_p, 0);
draw_ank(H_RED, 11-strlen(s_p), Tt.p, Tt.q, s_p, 0);
copy_window(P_i[i_WIN_PNA], P_v[v_KEY_TMP], 0x14, PEEK);
}
draw_ank(H_RED, 11-strlen(s_p), Tt.p, Tt.q, s_p, 0);
strcpy(Tt.s, s_p);
do {
while ((key = inkey(WINK)) == 0)
;
if (key == _ESC)
continue;
switch(key) {
case _UP:
if (!pna_n)
continue;
if (!pna_i)
continue;
pna_i--;
peek_dir(Dir, Dir->pre);
break;
case _DN:
if (!pna_n)
continue;
if (pna_i == pna_n-1)
continue;
pna_i++;
peek_dir(Dir, Dir->next);
break;
case _LT:
if (!dv_i)
continue;
dv_i--;
_select_disk(2);
_select_disk(dv_i);
key = BREAK;
continue;
break;
case _RT:
if (dv_i == dv_n-1)
continue;
dv_i++;
_select_disk(2);
_select_disk(dv_i);
key = BREAK;
continue;
break;
case _HOME:
P_i[i_PNA_N][dv_i] = -1;
key = BREAK;
continue;
break;
case _RET:
case S_RET:
if (!pna_n) {
key = 0;
continue;
}
key = pna_enter(key, file_a, &Tt);
G_pn.wink = P_i[i_WIN_PNA];
continue;
default:
continue;
}
strcpyfar(file_a, Dir->s);
strcpy(s_a, file_a);
s_p = shift_pna(s_a);
s_p[instring('.', s_p, sizeof(char))-1] = '\0';
draw_ank(H_RED, 11-strlen(Tt.s), Tt.p, Tt.q, Tt.s, 0);
for (i = 2; i; i--, exchange_page()) {
if (i == 1) {
copy_window(P_i[i_WIN_PNA], P_v[v_KEY_TMP], 0x14, POKE);
continue;
}
draw_ank(H_RED, 11-strlen(Tt.s), Tt.p, Tt.q, Tt.s, 0);
draw_ank(L_WHT, 11-strlen(Tt.s), Tt.p, Tt.q, Tt.s, 0);
draw_ank(L_WHT, 11-strlen(s_p), Tt.p, Tt.q, s_p, 0);
draw_ank(H_RED, 11-strlen(s_p), Tt.p, Tt.q, s_p, 0);
copy_window(P_i[i_WIN_PNA], P_v[v_KEY_TMP], 0x14, PEEK);
}
draw_ank(H_RED, 11-strlen(s_p), Tt.p, Tt.q, s_p, 0);
strcpy(Tt.s, s_p);
} while (key != _ESC && key != _RET && key != BREAK);
} while (key != _ESC && key != _RET);
P_i[i_PNA_I][dv_i] = pna_i;
P_i[i_PNA_N][dv_i] = pna_n;
goto_current();
res_bit(G_f, f_TT);
if (key == _ESC)
disp_menu(menu_i, P_v[v_VIEW_0], 2, 0);
else
disp_menu(menu_i, NULL, 6, 0);
G_nb.pna_drive = dv_i;
}
int make_pna_list(int dv_i)/*et*/
{
char dir_a[100], pna_a[100], current_a[100];
int exist, fd, pna_i;
DIR *Far;
DIR Dir[1];
_get_current_directory(current_a, 0);
pna_i = 0;
make_dir_list(dv_i);
peek_dir(Dir, G_bf.dir);
while (!_change_current_directory(".."))
;
while (1) {
_far_copy_buf(0x120, Dir->s, 0x14, pna_a, Dir->len);
strcpy(dir_a, pna_a);
dir_a[Dir->len-2] = '\0';
if (instring('\\', dir_a, 1))
_change_current_directory(dir_a);
exist = !_find_first_file(P_c[c_PNA_NAME], 0);
if (exist) {
set_pna_name(dv_i, pna_a);
pna_i++;
}
while (exist) {
exist = !_find_next_file();
if (!exist)
continue;
set_pna_name(dv_i, pna_a);
pna_i++;
}
if (!Dir->next)
break;
peek_dir(Dir, Dir->next);
}
while (_change_current_directory("..") != 0x03)
;
_change_current_directory(current_a);
return(pna_i);
}
void make_dir_list(int dv_i)/*et*/
{
char dir_a[100], current_a[100];
int i, len, fd, exist;
DTA *Dta;
_get_current_directory(current_a, 0);
while (!_change_current_directory(".."))
;
dir_a[0] = dv_i+_AA;
dir_a[1] = ':';
dir_a[2] = '\\';
dir_a[3] = '\0';
G_pn.dir = (char*)G_bf.dir; /* ←作業領域開始番地 (0x12000 bytes free) */
save_list(NULL, dir_a, &fd, &G_pn.dir);
exist = !_find_first_file(P_c[c_DIR_NAME], 0x10);
while (1) {
while (1) {
Dta = _get_disk_transfer_address();
_far_copy_buf(Dta->seg, Dta->addr, 0x14, P_c[c_DTA_TAB], 0x40);
if (strcmp(".", &P_c[c_DTA_TAB][0x1e]))
if (strcmp("..", &P_c[c_DTA_TAB][0x1e]))
break;
exist = !_find_next_file();
if (!exist)
break;
}
if (exist) {
_copy_buf(&P_c[c_DTA_TAB][2], &P_c[c_DTA_TAB][0x1e], 13);
*P_c[c_DTA_TAB] = '.';
P_c[c_DTA_TAB][1] = '\\';
len = strlen(dir_a);
if (!_change_current_directory(&P_c[c_DTA_TAB][2])) {
_change_current_directory("..");
strcat(dir_a, &P_c[c_DTA_TAB][2]);
strcat(dir_a, "\\");
save_list(G_bf.dir, dir_a, &fd, &G_pn.dir);
if (fd)
dir_a[len] = '\0';
else {
_change_current_directory(&P_c[c_DTA_TAB][2]);
exist = !_find_first_file(P_c[c_DIR_NAME], 0x10);
continue;
}
}
} else {
if (_change_current_directory(".."))
break;
dir_a[2] = '\\';
_get_current_directory(&dir_a[3], dv_i+1);
if (strlen(dir_a) > 3)
strcat(dir_a, "\\");
exist = !_find_first_file(P_c[c_DIR_NAME], 0x10);
continue;
}
exist = !_find_next_file();
}
while (_change_current_directory("..") != 0x03)
;
_change_current_directory(current_a);
}
int pna_enter(int key, char file_a[], TT *Tt)/*et*/
{
FILE *File;
int file_n, k, max_i, edge_i, cut;
int cut_b, edge_b, mm;
file_n = G_nb.csr;
set_bit(G_f, f_AA);
res_bit(G_f, f_NN);
if (key == S_RET) {
Tt->col = H_BLU;
mm = 0;
} else {
Tt->col = H_RED;
mm = 1;
}
draw_ank(H_RED, 11-strlen(Tt->s), Tt->p, Tt->q, Tt->s, 0);
for (k = 2; k; k--, exchange_page()) {
if (k == 1) {
copy_window(P_i[i_WIN_VRAM], P_v[v_VRAM], 0x14, POKE);
continue;
}
cls_view(P_i[i_WIN_VIEW]);
if (!mm) {
draw_ank(H_RED, 11-strlen(Tt->s), Tt->p, Tt->q, Tt->s, 0);
draw_ank(H_BLU, 11-strlen(Tt->s), Tt->p, Tt->q, Tt->s, 0);
}
copy_window(P_i[i_WIN_VRAM], P_v[v_VRAM], 0x14, PEEK);
}
G_ps.x = 0;
G_ps.y = 0;
G_ps.z = (int)(G_pm.i.dist - G_pm.i.pers) * GETA_ET;
set_bit(G_f, f_BAR);
key = make_pna(file_a);
res_bit(G_f, f_BAR);
G_nb.cut = 0;
if (key != _ESC) {
P_c[c_CSR][0] = file_n+1;
G_mv[0].key = _BK;
G_mv[1].key = EOK;
init_st();
set_file_i(&P_c[c_FILE_BAK][8], 3);
File = et_fopen(P_c[c_FILE_BAK], "rb", NULL);
fread(&G_nb.edge, sizeof(int), 1, File);
max_i = G_nb.edge-G_nb.max_edge;
if (G_nb.edge > G_nb.max_edge) {
fread(G_et, sizeof(ET), G_nb.max_edge, File);
fread(G_bf.et_buf, sizeof(ET), max_i, File);
G_nb.edge = G_nb.max_edge;
} else
fread(G_et, sizeof(ET), G_nb.edge, File);
fclose(File);
set_bit(G_f, f_EE);
for (k = 2; k; k--, exchange_page()) {
if (k == 1) {
copy_window(P_i[i_WIN_MENU], P_v[v_VRAM], 0x14, POKE);
continue;
}
draw_mode(5, mn_EE, L_WHT);
draw_mode(5, mn_EE, H_RED);
set_trace_mode(test_bit(G_f, f_AA|f_NN));
copy_window(P_i[i_WIN_MENU], P_v[v_VRAM], 0x14, PEEK);
}
edge_i = 0;
if (test_bit(G_f, f_REPLAY)) {
cut_b = read_replay(0);
edge_b = read_replay(0);
}
set_bit(G_f, f_BAR);
make_et(&edge_i, &cut, cut_b, edge_b, mm);
res_bit(G_f, f_BAR);
G_nb.cut = 0;
if (!test_bit(G_f, f_DEMO|f_MAKE|f_REPLAY)) {
if (cut) {
write_replay(cut);
write_replay(edge_i);
} else {
write_replay(0);
write_replay(-1);
}
}
draw_cut(cut);
if (cut != _ESC) {
for (k = 2; k; k--, exchange_page()) {
if (k == 1) {
copy_window(P_i[i_WIN_MENU], P_v[v_VRAM], 0x14, POKE);
continue;
}
draw_mode(2, mn_UP, L_WHT);
draw_mode(2, mn_DN, L_WHT);
draw_mode(2, mn_LT, L_WHT);
draw_mode(2, mn_RT, L_WHT);
copy_window(P_i[i_WIN_MENU], P_v[v_VRAM], 0x14, PEEK);
}
G_nb.mn = mn_EE;
key = sub_enter2(edge_i, file_n, mm);
G_nb.mn = mn_TT;
} else
key = cut;
res_bit(G_f, f_EE);
access_page();
copy_window(P_i[i_WIN_VIEW], P_v[v_VIEW_1], 0x120, PEEK);
access_page();
copy_window(P_i[i_WIN_VIEW], P_v[v_VIEW_1], 0x120, POKE);
for (k = 2; k; k--, exchange_page()) {
if (k == 1) {
copy_window(P_i[i_WIN_MENU], P_v[v_VRAM], 0x14, POKE);
continue;
}
draw_mode(5, mn_EE, H_RED);
draw_mode(5, mn_EE, L_WHT);
draw_mode(3, mn_UP, L_WHT);
draw_mode(3, mn_DN, L_WHT);
draw_mode(3, mn_LT, L_WHT);
draw_mode(3, mn_RT, L_WHT);
copy_window(P_i[i_WIN_MENU], P_v[v_VRAM], 0x14, PEEK);
}
if (key != _ESC) {
goto_current();
key = _RET;
}
}
if (key == _ESC) {
copy_buffer(2, RESTORE, NULL, 0);
for (k = 2; k; k--, exchange_page()) {
if (k == 1) {
copy_window(P_i[i_WIN_VRAM], P_v[v_VRAM], 0x14, POKE);
continue;
}
cls_view(P_i[i_WIN_VIEW]);
copy_window(P_i[i_WIN_VIEW], P_v[v_VIEW_0], 0x120, POKE);
draw_ank(Tt->col, 11-strlen(Tt->s), Tt->p, Tt->q, Tt->s, 0);
draw_ank(H_RED, 11-strlen(Tt->s), Tt->p, Tt->q, Tt->s, 0);
draw_edge(P_SET, AFT);
set_trace_mode(test_bit(G_f, f_AA|f_NN));
copy_window(P_i[i_WIN_VRAM], P_v[v_VRAM], 0x14, PEEK);
}
draw_ank(H_RED, 11-strlen(Tt->s), Tt->p, Tt->q, Tt->s, 0);
key = 0;
}
return(key);
}
void disp_drive(int old_i, int new_i, TT Tt)/*et*/
{
int i;
P_c[c_PNA_OLD][1] = old_i + 0x60;
if (new_i >= 0)
P_c[c_PNA_NEW][1] = new_i + 0x60;
for (i = 2; i; i--, exchange_page()) {
draw_kanji(H_RED, 0, Tt.p-64, Tt.q, P_c[c_PNA_OLD]);
if (new_i >= 0)
draw_kanji(H_RED, 0, Tt.p-64, Tt.q, P_c[c_PNA_NEW]);
}
}
void set_pna_name(int dv_i, char *pna_p)/*et*/
{
DIR *Far;
DTA *Dta;
int fd, len;
char pna_a[100];
Far = G_bf.pna; /* ←PNA リスト開始番地 (0xA000 bytes free) */
strcpy(pna_a, pna_p);
len = strlen(pna_a);
Dta = _get_disk_transfer_address();
_far_copy_buf(Dta->seg, Dta->addr, 0x14, P_c[c_DTA_TAB], 0x40);
_copy_buf(P_c[c_DTA_TAB], &P_c[c_DTA_TAB][0x1e], 13);
P_c[c_DTA_TAB][instring('.', P_c[c_DTA_TAB], sizeof(char))+3] = '\0';
strcpy(&pna_a[len], P_c[c_DTA_TAB]);
if (G_pn.pna != (char*)G_bf.pna)
save_list(Far, pna_a, &fd, &G_pn.pna);
else
save_list(NULL, pna_a, &fd, &G_pn.pna);
}
int find_pna(int dv_i, int pna_i, DIR Dir[])/*et*/
{
int fd;
peek_dir(Dir, G_bf.pna);
fd = 0;
while (Dir->dir) {
fd = _peek_byte(0x120, Dir->s) == (dv_i + _AA);
if (fd || !Dir->next)
break;
peek_dir(Dir, Dir->next);
}
for (; pna_i; pna_i--)
peek_dir(Dir, Dir->next);
return(fd);
}
DIR *save_list(DIR *Far, char *file_p, int *find_p, char **bf_pp)/*et*/
{
char file_a[100];
FILE *File;
DIR *Tmp, Dir[1];
*find_p = 0;
if (!Far) {
Far = (DIR*)*bf_pp;
Dir->len = strlen(file_p)+1;
Dir->pre = Far; /* ← リスト先頭の pre */
Dir->dir = Far; /* move_pna() で使用 */
Dir->next = NULL;
Dir->s = (char*)((int)Far + sizeof(DIR));
poke_dir(Dir, Far);
_far_copy_buf(0x14, file_p, 0x120, Dir->s, Dir->len);
*bf_pp = (char*)((int)*bf_pp + sizeof(DIR) + Dir->len);
} else {
peek_dir(Dir, Far);
_far_copy_buf(0x120, Dir->s, 0x14, file_a, Dir->len);
if (strcmp(file_a, file_p)) {
Dir->next = save_list(Dir->next, file_p, find_p, bf_pp);
poke_dir(Dir, Far); /* Dir->next 保存 */
Tmp = Dir->next; /* ←次行で Dir->next が変更 */
peek_dir(Dir, Dir->next);
Dir->pre = Far; /* ← リスト先頭以外の pre */
poke_dir(Dir, Tmp); /* Dir->next->pre 保存 */
} else
*find_p = 1;
}
return(Far);
}
void move_pna(int dv_i)/*et*/
{
int fd;
DIR New[1], Old[1];
unsigned pna_d;
fd = find_pna(dv_i, 0, Old); /* dv_iドライブのファイルリストの先頭を探す */
if (!fd) /* ← dv_i 領域がない */
return;
_copy_buf(New, Old, sizeof(DIR));
if (New->next)
while (1) {
fd = _peek_byte(0x120, New->s) != dv_i + _AA;
if (fd || !New->next) /* dv_i でない先頭があるか, または終わり */
break;
peek_dir(New, New->next);
}
if (!fd && !New->next) { /* dv_i でない領域がない */
if (New->dir == G_bf.pna) {
G_pn.pna = (char*)G_bf.pna;
New->dir = NULL;
poke_dir(New, (DIR*)G_pn.pna);
} else {
peek_dir(New, Old->pre);
New->next = NULL;
poke_dir(New, Old->pre); /* New->next 保存 */
G_pn.pna = (char*)Old->dir;
}
} else { /* dv_i でない領域がある */
pna_d = (int)New->dir - (int)Old->dir; /* dv_i 領域幅算出 */
while (1) {
Old->dir = New->dir;
Old->next = New->next;
New->pre = (DIR*)((int)New->pre-pna_d); /* 各ポインタを */
New->dir = (DIR*)((int)New->dir-pna_d); /* 領域幅分減少 */
if (New->next) /* NULL (最後) はパス */
New->next = (DIR*)((int)New->next-pna_d);
New->s = (char*)((int)New->s-pna_d);
poke_dir(New, Old->dir); /* ポインタ保存 */
_far_copy_buf(0x120, Old->dir, /* dv_i でない DIR を */
0x120, (void*)((int)Old->dir - pna_d), /* dv_i だった DIR へ */
sizeof(DIR)+New->len);
if (!Old->next)
break;
peek_dir(New, Old->next); /* 次の DIR へ */
}
G_pn.pna -= pna_d;
}
}